
/*FUNCIONES PARA MANEJO DE STRINGS*/
#include "../include/strings.h"
#include "../include/stdIO.h"
#include "../include/driverVideo.h"
#include "../include/pruebaExc.h"
#include "../include/getnum.h"
#define 	putchar(c) 	putc((c), 1)
#define getchar()	getc(0)		/*fd=0 es el del teclado, getchar levanta un caracter del teclado*/

char getc(int fd)
{
    int flag=0;
    char scanC,aux, next;
    while(flag == 0)
    {
      flag = read(fd,&scanC,1);
      if(flag)
    return scanC;
    }
}


void putc(char c, int fd)
{	 
	write(fd, &c, 1);
}
//devuelve 0 si son iguales
int strcmp(char *s, const char *t)
{
	int i;
	
	for(i=0; s[i] == t[i]; i++)
		if(s[i] == '\0')
			return 0;
	return s[i]-t[i];
}
//devuelve 1 si son iguales 
int strNcmp(char *s, const char *t, int n)
{	int i=0;
	while(n--)
		if(s[i]!=t[i++])
			return 0;
	return 1;
}

void print(char * msj)
{
	char c;	
	while((c=*msj) != '\0')
	{
		if( (*msj) == '\n')
		{
				isEnter();
				 return;
		}
		  else
			putchar(c);
		msj++;
	}
}

int strln(char * str)
{
	
	int lenth=0;	

	while((*(str++))!= '\0')
		lenth++;

	return lenth;
}

void strcpy(char *s, char *t)
{
	while((*s=*t)!= '\0')
	{
		s++;
		t++;
	}
}
/*Devulve el indice del primer carater que no es un espacio, si no hay caracter devuelve el ultimo espacio*/
int firstCaracter(char * string)	
{
	int i=0;
	int tam=strln(string);
	while(isspace(*(string++)))
		i++;
	if(i < tam)
		return i;
	return i-1;
}
	
int isspace(char c)	/*devuelve 1 si el caracter es un espacio*/
{
	return (c== ' ');
}

int isdigit(char c)	/*devuelve 1 si el caracter es un sigito*/
{
	return((c >= '0') && (c <= '9'));
}
int ishexa(char c)
{
  return(isdigit(c) || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f'));
}
int isalpha(char c)
{
	return(((c >='A') && (c <= 'Z')) || ((c >= 'a') && (c <= 'z')));
}
//devuelve la dim
int
limpiarBlancos(char * string, int maxsize)
{
	int i, j = 0;

	for(i = 1; string[i] != '\0' && i < maxsize; i++)
	{
		if((string[i-1] != ' ' && string[i] == ' ') || (string[i-1] == ' ' && string[i] != ' ' && j != 0) || 
		  (string[i-1] != ' ' && string[i] != ' '))
		{
			string[j] = string[i-1];
			j++;
		}
	}
	if(string[i-1] != ' ')
		string[j] = string[i-1];
	if(string[j] == ' ')
		--j;
	string[++j] = '\0';
	return j;	
}
int
isupper(char c)
{
  return (c >= 'A' && c <= 'Z');
}
int
islower(char c)
{
  return (c >= 'a' && c <= 'z');
}

int
printf(const char * fmt, ...)
{
  int i, cant = 0;
  
  void ** args = (void**)&fmt;			//le tomo el puntero a fmt
  args++;					//args apunta la primer argumento no conocido
  for(i = 0; fmt[i] != '\0'; i++)
  {
    if(fmt[i] == '%')
    {
      i++;
      switch(fmt[i])
      {
	case 'd' : case 'i' :
	  printInt(*(int*)args);
	  break;
	case 'c' :
	  putchar(*(char*)args);
	  break;
	case 's' :
	  print(*(char**)args);
	  break;
	default:
	  print("%");
	  putchar(fmt[i]);
	  break;
      }
      cant++;				//cant de arg no conocidos impresos
      args++;				//apunto al siguiente argumento no conocido
    }
    else
      putchar(fmt[i]);
  }
  return cant;
}

void intToString(char *buf,int num)
{
	int i=0,flag=0;
	if (num==0)
		buf[i++]='0';

	if (num<0)
	{
		flag=1;
		num=num*-1;
	}

	while (num>0)
	{
		buf[i++]=(num % 10)+'0';
		num = num / 10;
	}
	if (flag==1)
	{
		buf[i++]='-';
	}
	buf[i]=0;
	//reverse(buf);
}

//esta la idea pero no esta terminado y la faltan un par de cosas

char * getString(char * cadena, int size){
	int i=0;
	char caracter;
	for(i=0; i<size; i++){
		cadena[i]='\0';
	}
	for(i=0; i<size-1; i++){
		caracter = getchar();
		if(caracter == KEY_ENTER){
			print("\n");
			break;
		}else
		{
			printf("%c", caracter);
			cadena[i] = caracter;
		}
	}
	return cadena;
}
int
scanf(const char * fmt, ...)
{
  int i, cant = 0;
  int algo;
  int b;
  char caracter;
  char caden[30];
  void ** args = (void**)&fmt;			//le tomo el puntero a fmt
  args++;					//args apunta la primer argumento no conocido
  int cont=0;
 
  for(i = 0; fmt[i] != '\0'; i++)
  {
    if(fmt[i] == '%')
    {
      i++;
      switch(fmt[i])
      {
	case 'd' : case 'i' :
		algo = getint();
		*(int*)args[0] = algo;
	  break;
	case 'c' :
		caracter = getchar();
		while(caracter == KEY_ENTER){
			caracter = getchar();
		}
		printf("%c", caracter);
		print("\n");
		*(char*)args[0]=caracter;
	  break;
	case 's' :
		strcpy(*(char**)args, getString(caden, sizeof(caden)));		
	  break;
	default:
	  break;
      }
      cant++;				//cant de arg no conocidos impresos
      args++;				//apunto al siguiente argumento no conocido
    }
  }
  return cant;
}

